#include <iostream>
#include <fstream>
#include <ostream>
#include <istream>
// fstream = filestream 包含ifstream和ofstream 类似于cout和cin

int main()
{
    using namespace std;

    char tempInput1[100]; // 声明一个数组用于存放输入

    cout << "starting output!" << endl;
    ofstream fileOutPutStream; // 创建一个输出流对象
    // fileOutPutStream.open("21fileReadAndWrite.txt", ios::app); // 指定输出流对象的路径值 (括号中的值,工作模式)
    fileOutPutStream.open("21fileReadAndWrite.txt");
    // 工作模式中,您可以把以上两种或两种以上的模式结合使用。

    // 例如，如果您想要以写入模式打开文件，并希望截断文件，以防文件已存在，那么您可以使用下面的语法：
    //    ofstream outfile;
    //    outfile.open("file.dat", ios::out | ios::trunc);

    // 类似地，您如果想要打开一个文件用于读写，可以使用下面的语法：
    //    ifstream afile;
    //    afile.open("file.dat", ios::out | ios::in);

    // 默认情况下,为覆盖模式(文件中所有的东西将会消失),可以添加第二个参数指定工作的模式

    // 模式标志            描述
    // ios::app        追加模式。所有写入都追加到文件末尾。
    // ios::ate        文件打开后定位到文件末尾。
    // ios::in         打开文件用于读取。
    // ios::out        打开文件用于写入。
    // ios::trunc      如果该文件已经存在，其内容将在打开文件之前被截断，即把文件长度设为 0。

    cin.get(tempInput1, 100); // 获取输入

    cout << tempInput1;                     // 在控制台中打印输入的内容
    fileOutPutStream << tempInput1 << endl; // 将输入的内容输出到指定的文件流中
    fileOutPutStream.close();               // 输出流关闭

    cout << "output complete!" << endl;
    ////////////////////////////////////////////////////////////////////////

    cout << "starting input" << endl;
    char tempInput2[100];                           //开辟一个数组用于存放文件读取的内容
    ifstream inputFileStream;                       // 创建输入流
    inputFileStream.open("21fileReadAndWrite.txt"); // 指定输入流的路径
    if (!inputFileStream.is_open())                 //判定输入流的工作状态,使用is_open()方法判定文件流是否被打开
    {
        cout << "open file ERROR" << endl;
        exit(EXIT_FAILURE);
    }
    inputFileStream.getline(tempInput2, 100 - 1); // 像使用cin一样使用ifstream对象,读取到tempInput数组中
    cout << tempInput2 << endl;                   // 将读取到的输入打印到控制台中
    inputFileStream.close();                      // 将输入流关闭

    cout << "input complete!" << endl;

    return 0;
}